package com.baoyouqun.domain.VO;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import com.baoyouqun.domain.Enum.SystemConfigType;
import com.baoyouqun.entity.SystemConfig;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Data
public class VirtualCallDTO implements Serializable {
    private static final long serialVersionUID = 1L; // 添加序列化版本号
    private String id;

    @ApiModelProperty(value = "是否开启虚拟通话服务")
    private Boolean chargeEnabled;

    @ApiModelProperty(value = "套餐列表")
    private List<CallPackageDTO> list;

    /**
     * 从SystemConfig转换（使用FastJSON2反序列化JSON数组）
     */
    public static VirtualCallDTO fromSystemConfig(SystemConfig systemConfig) {
        if (systemConfig == null || !SystemConfigType.VIRTUAL_CALL.equals(systemConfig.getConfigType())) {
            throw new IllegalArgumentException("无效的虚拟通话配置数据: 配置类型不匹配或配置为空");
        }

        VirtualCallDTO dto = new VirtualCallDTO();
        dto.setId(systemConfig.getId());
        // 基础类型映射（确保info2为Boolean类型）
        dto.setChargeEnabled(systemConfig.getInfo2());

        // 从info8读取JSON数组并反序列化为List<CallPackageDTO>
        String listJson = systemConfig.getInfo8();
        if (listJson != null && !listJson.trim().isEmpty()) {
            try {
                // 使用FastJSON2反序列化，指定泛型类型
                dto.setList(JSON.parseObject(listJson, new TypeReference<List<CallPackageDTO>>() {
                }));
            } catch (Exception e) {
                throw new RuntimeException("虚拟通话套餐列表反序列化失败: " + listJson, e);
            }
        } else {
            dto.setList(new ArrayList<>()); // 空列表默认值
        }

        return dto;
    }

    /**
     * 转换为SystemConfig（使用FastJSON2序列化List为JSON数组）
     */
    public SystemConfig toSystemConfig(SystemConfig config) {


        config.setConfigType(SystemConfigType.VIRTUAL_CALL);
        config.setConfigName(SystemConfigType.VIRTUAL_CALL.getDesc());

        // 基础类型映射（Boolean -> info2）
        config.setInfo2(this.chargeEnabled);

        // 使用FastJSON2将List序列化为JSON数组字符串，存入info8
        try {
            if (this.list != null) {
                config.setInfo8(JSON.toJSONString(this.list));
            } else {
                config.setInfo8("[]"); // 空数组默认值，避免null
            }
        } catch (Exception e) {
            throw new RuntimeException("虚拟通话套餐列表序列化失败", e);
        }

        return config;
    }

    // 改为静态内部类，确保反序列化正常工作
    @Data
    public static class CallPackageDTO implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L; // 添加序列化版本号

        @ApiModelProperty(value = "时长（分钟）")
        private Integer minutes;  // 单次时长限制（分钟）

        @ApiModelProperty(value = "价格（元）")
        private BigDecimal price;     // 费率（元/分钟）
    }
}
